#include "niming.h"
#include "main.h"
#include "usart.h"

uint8_t data_to_send[100];

void ANO_DT_Send_F1(uint16_t _a, uint16_t _b, uint16_t _c, uint16_t _d){
    uint8_t _cnt = 0; // 计数值
    uint8_t sumcheck = 0; // 和校验
    uint8_t addcheck = 0; // 附加和校验
    uint8_t i = 0;

    data_to_send[_cnt++] = 0XAB;
    data_to_send[_cnt++] = 0xFF;
    data_to_send[_cnt++] = 0xFF;
    data_to_send[_cnt++] = 0XF1;
    data_to_send[_cnt++] = 8; // 数据长度
    data_to_send[_cnt++] = 0; //

    // 单片机为小端模式，先发低位数据，所以先发低地址
    data_to_send[_cnt++] = BYTE0(_a);
    data_to_send[_cnt++] = BYTE1(_a);
    data_to_send[_cnt++] = BYTE0(_b);
    data_to_send[_cnt++] = BYTE1(_b);
    data_to_send[_cnt++] = BYTE0(_c);
    data_to_send[_cnt++] = BYTE1(_c);
    data_to_send[_cnt++] = BYTE0(_d);
    data_to_send[_cnt++] = BYTE1(_d);

    for (i = 0; i < data_to_send[4] + 6; i++) {
        sumcheck += data_to_send[i]; // 和校验
        addcheck += sumcheck; // 附加校验
    }
    data_to_send[_cnt++] = sumcheck;
    data_to_send[_cnt++] = addcheck;
    HAL_UART_Transmit(&huart3, data_to_send, _cnt, 0xFFFF); // 串口发送函数

}

void ANO_DT_Send_F2(int16_t _a, int16_t _b, int16_t _c, int16_t _d){
    uint8_t _cnt = 0;
    uint8_t sumcheck = 0; // 和校验
    uint8_t addcheck = 0; // 附加和校验
    uint8_t i = 0;

    data_to_send[_cnt++] = 0XAB;
    data_to_send[_cnt++] = 0xFF;
    data_to_send[_cnt++] = 0xFF;
    data_to_send[_cnt++] = 0XF2;
    data_to_send[_cnt++] = 8; // 数据长度
    data_to_send[_cnt++] = 0; //

    // 单片机为小端模式 - 低地址存放低位数据，匿名上位机要求先发低位数据，所以先发低地址
    data_to_send[_cnt++] = BYTE0(_a);
    data_to_send[_cnt++] = BYTE1(_a);
    data_to_send[_cnt++] = BYTE0(_b);
    data_to_send[_cnt++] = BYTE1(_b);
    data_to_send[_cnt++] = BYTE0(_c);
    data_to_send[_cnt++] = BYTE1(_c);
    data_to_send[_cnt++] = BYTE0(_d);
    data_to_send[_cnt++] = BYTE1(_d);

    for (i = 0; i < data_to_send[4] + 6; i++) {
        sumcheck += data_to_send[i]; // 和校验
        addcheck += sumcheck; // 附加校验
    }
    data_to_send[_cnt++] = sumcheck;
    data_to_send[_cnt++] = addcheck;

    HAL_UART_Transmit(&huart3, data_to_send, _cnt, 0xFFFF); // 串口发送函数

}


void ANO_DT_Send_F3(int16_t _a, int16_t _b, int16_t _c){
    uint8_t _cnt = 0;
    uint8_t sumcheck = 0; // 和校验
    uint8_t addcheck = 0; // 附加和校验
    uint8_t i = 0;

    data_to_send[_cnt++] = 0XAB;
    data_to_send[_cnt++] = 0xFF;
    data_to_send[_cnt++] = 0xFF;
    data_to_send[_cnt++] = 0XF3;
    data_to_send[_cnt++] = 6; // 数据长度
    data_to_send[_cnt++] = 0; //

    // 单片机为小端模式 - 低地址存放低位数据，匿名上位机要求先发低位数据，所以先发低地址
    data_to_send[_cnt++] = BYTE0(_a);
    data_to_send[_cnt++] = BYTE1(_a);
    data_to_send[_cnt++] = BYTE0(_b);
    data_to_send[_cnt++] = BYTE1(_b);
    data_to_send[_cnt++] = BYTE0(_c);
    data_to_send[_cnt++] = BYTE1(_c);


    for (i = 0; i < data_to_send[4] + 6; i++) {
        sumcheck += data_to_send[i]; // 和校验
        addcheck += sumcheck; // 附加校验
    }
    data_to_send[_cnt++] = sumcheck;
    data_to_send[_cnt++] = addcheck;
    HAL_UART_Transmit(&huart3, data_to_send, _cnt, 0xFFFF); // 串口发送函数

}

void sent1_F1frame(int32_t x, int32_t y)
{
    uint8_t _cnt = 0;
    data_to_send[_cnt++] = 0xAB; // 帧头
    data_to_send[_cnt++] = 0xFF; // 源地址
    data_to_send[_cnt++] = 0xFF; // 目标地址
    data_to_send[_cnt++] = 0xF1; // 功能码（ID）
    data_to_send[_cnt++] = 8;   // 数据长度（2字节）
    data_to_send[_cnt++] = 0;    // 数据长度

    // 存数据 BEGIN
    data_to_send[_cnt++] = BYTE0(x);
    data_to_send[_cnt++] = BYTE1(x);
    data_to_send[_cnt++] = BYTE2(x);
    data_to_send[_cnt++] = BYTE3(x);

    data_to_send[_cnt++] = BYTE0(y);
    data_to_send[_cnt++] = BYTE1(y);
    data_to_send[_cnt++] = BYTE2(y);
    data_to_send[_cnt++] = BYTE3(y);
    // 存数据 END

    uint8_t sumcheck = 0;
    uint8_t addcheck = 0;
    uint16_t flen = data_to_send[4] + data_to_send[5] * 256; // 计算数据长度
    for (uint16_t i = 0; i < (flen + 6); i++) // 校验计算
    {
        sumcheck += data_to_send[i]; // 累加和校验
        addcheck += sumcheck; // 累加附加校验
    }
    data_to_send[_cnt++] = sumcheck; // 和校验
    data_to_send[_cnt++] = addcheck; // 附加校验
    HAL_UART_Transmit(&huart3, data_to_send, _cnt, 0xFFFF); // 串口发送
}

void sent_F1frame(uint32_t x1_ual,
                  uint32_t x1_enc,
                  uint32_t x2_ual,
                  uint32_t x2_enc,
                  uint32_t y1_ual,
                  uint32_t y1_enc,
                  uint32_t y2_ual,
                  uint32_t y2_enc)
{
    uint8_t _cnt = 0;
    data_to_send[_cnt++]=0xAB;//帧头
    data_to_send[_cnt++]=0xFF;//源地址
    data_to_send[_cnt++]=0xFF;//目标地址
    data_to_send[_cnt++]=0xF1;//功能码（ID）
    data_to_send[_cnt++]=32;  //数据长度（2字节）
    data_to_send[_cnt++]=0;   //数据长度

//存数据 BEGIN
    data_to_send[_cnt++]=BYTE0(x1_ual);
    data_to_send[_cnt++]=BYTE1(x1_ual);
    data_to_send[_cnt++]=BYTE2(x1_ual);
    data_to_send[_cnt++]=BYTE3(x1_ual);

    data_to_send[_cnt++]=BYTE0(x1_enc);
    data_to_send[_cnt++]=BYTE1(x1_enc);
    data_to_send[_cnt++]=BYTE2(x1_enc);
    data_to_send[_cnt++]=BYTE3(x1_enc);

    data_to_send[_cnt++]=BYTE0(x2_ual);
    data_to_send[_cnt++]=BYTE1(x2_ual);
    data_to_send[_cnt++]=BYTE2(x2_ual);
    data_to_send[_cnt++]=BYTE3(x2_ual);

    data_to_send[_cnt++]=BYTE0(x2_enc);
    data_to_send[_cnt++]=BYTE1(x2_enc);
    data_to_send[_cnt++]=BYTE2(x2_enc);
    data_to_send[_cnt++]=BYTE3(x2_enc);

    data_to_send[_cnt++]=BYTE0(y1_ual);
    data_to_send[_cnt++]=BYTE1(y1_ual);
    data_to_send[_cnt++]=BYTE2(y1_ual);
    data_to_send[_cnt++]=BYTE3(y1_ual);

    data_to_send[_cnt++]=BYTE0(y1_enc);
    data_to_send[_cnt++]=BYTE1(y1_enc);
    data_to_send[_cnt++]=BYTE2(y1_enc);
    data_to_send[_cnt++]=BYTE3(y1_enc);

    data_to_send[_cnt++]=BYTE0(y2_ual);
    data_to_send[_cnt++]=BYTE1(y2_ual);
    data_to_send[_cnt++]=BYTE2(y2_ual);
    data_to_send[_cnt++]=BYTE3(y2_ual);

    data_to_send[_cnt++]=BYTE0(y2_enc);
    data_to_send[_cnt++]=BYTE1(y2_enc);
    data_to_send[_cnt++]=BYTE2(y2_enc);
    data_to_send[_cnt++]=BYTE3(y2_enc);
//存数据 END
    uint8_t sumcheck = 0;
    uint8_t addcheck = 0;
    uint16_t flen = data_to_send[4] + data_to_send[5] * 256;
    for(uint16_t i = 0; i < (flen+6); i++)//校验计算
    {
        sumcheck += data_to_send[i];
        addcheck += sumcheck;
    }
    data_to_send[_cnt++] = sumcheck;//和校验
    data_to_send[_cnt++] = addcheck;//附加校验
    HAL_UART_Transmit(&huart3, data_to_send, _cnt, 0xFFFF);//串口发送
}
